`define PRINT 

program class_static;
    // Class with constructor, with no parameter
    // 类中的方法（函数和任务）默认是 automatic 的，无需显式声明。
    class Counter;
        // 若类的成员变量和方法内部的变量声明为 static，则该变量的存储空间在所有实例间共享。
        // Make size as static variable
        static integer size;
        string name;

        // Constructor
        function new(string name);
            begin
                this.name = name;
                this.size = 0;
            end
        endfunction

        // Static function for class
        // 注意: 当 static 关键字出现在 function 或 task 之前时，
        // 表示该方法属于类本身（而非实例），可直接通过类名调用。
        // 静态方法不能访问非静态成员, 静态方法中不能使用 this 关键字
        static function void reset_size();
            $display("Reset size for all instances");
            size = 0;
        endfunction

        // Increment size task
        function void inc_size();
            this.size ++;
            $write("%s -> size is incremented\n",this.name);
        endfunction

        // Task in class (object method)
        task print();
            $write("%s -> Size is %0d\n",this.name, this.size);
        endtask

    endclass

    Counter a, b, c;

    initial begin
        a = new("A");
        b = new("B");
        c = new("C");
        a.inc_size();
        a.print();
        b.print();
        c.print();
        c.inc_size();
        a.print();
        b.print();
        c.print();
        // Call static function
        Counter::reset_size(); // Scope Resolution Operator ::
        a.print();
        b.print();
        c.print();
    end

endprogram
